#pragma once
#include "Connection.hpp"
#include "Socket.hpp"
#include "Logger.hpp"
#include "Common.hpp"
#include "Protocol.hpp"
#include "Caculate.hpp"
#include "IOServer.hpp"

using namespace SocketModule;

class Listener : public Connection
{
public:
    virtual void Sender() 
    {}
    virtual void Excepter()
    {}
    Listener(int port) : _port(port), _listenfd(std::make_unique<TcpSocket>())
    {
        _listenfd->BuildTcpSocket(_port);
        Setfd(_listenfd->Fd());
        // 设置工作模式为ET
        SetEvent(EPOLLIN | EPOLLET);
    }
    int Fd() { return _listenfd->Fd(); }
    void Recver() override
    {
        // 非阻塞循环阻塞
      
        while (true)
        {
            InetAddr peer;
            int lerror = 0;
            int fd = _listenfd->Accept(&peer, &lerror);
            if (fd > 0)
            {
                LOG(LogLevel::DEBUG) << "Accepter sucess " << fd;
                // 1. 创建新连接
                auto con = std::make_shared<IOServer>(fd);
                // 2.注册业务方法
                con->RegisterMessageHandler(Hander);
                // 3.将新连接加入管理
                GetOwner()->InsertConnection(con);
            }
            else
            {
                if (lerror == EAGAIN || lerror == EWOULDBLOCK)
                {
                    // 对于读操作：没有数据可读（例如套接字接收缓冲区为空）。
                    // 对于写操作：缓冲区已满（例如套接字发送缓冲区无空间）。
                    // 对于连接操作：没有待处理的连接（如 accept 时连接队列为空）
                    LOG(LogLevel::DEBUG) << "accetper all connection ... done";
                    break;
                }
                else if (lerror == EINTR)
                {
                    // 被系统信号中断，进行重试
                    LOG(LogLevel::DEBUG) << "accetper intr by signal, continue";
                    continue;
                }
                else
                {
                    LOG(LogLevel::WARNING) << "accetper error ... Ignore";
                    break;
                }
            }
        }
    }

private:
    std::unique_ptr<Socket> _listenfd;
    int _port;
};